home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / linux-bo / etherboo.000 / etherboo / etherboot-2.0 / netboot-freebsd / start16.S < prev    next >
Text File  |  1996-01-19  |  9KB  |  517 lines

  1. /* Stack needs to be end of bss + stacksize, but not exceeding lower 640kb */
  2. #if (RELOC+0xE000) > 0xA0000
  3. #define STACKADDR    (0xA0000-RELOC)
  4. #else
  5. #define STACKADDR    0xE000
  6. #endif
  7.  
  8. /* Don't copy ROM to above 640kB */
  9. #if (RELOC+ROMSIZE) > 0xA0000
  10. #define    RAMSIZE        (0xA0000-RELOC)
  11. #else
  12. #define    RAMSIZE        ROMSIZE
  13. #endif
  14.  
  15. ;
  16. ;    The startup code for BOOTROM is different from that
  17. ;    in netboot-32. I don't understand why they hook
  18. ;    the start vector to INT19 and in any case it
  19. ;    doesn't work on my XT. So I just hook onto the
  20. ;    BIOS far call. It means that ROMS residing
  21. ;    above the BOOTROM haven't been called yet.
  22. ;
  23.  
  24. /**************************************************************************
  25. START - Where all the fun begins....
  26. **************************************************************************/
  27.     .globl    _start
  28. _start:
  29. #ifdef BOOTROM
  30.     .word    0xaa55            /* bios extension signature */
  31.     .byte    (ROMSIZE>>9)        /* no. of 512B blocks */
  32.     jmp    skip            /* enter from bios here */
  33.     .byte    0            /* checksum */
  34. skip:
  35. #endif
  36.     cli
  37.     cld
  38.     mov    dx,ss            ;get current stack
  39.     mov    ax,sp
  40.     mov    bx,*(RELOC>>4)        ;new ss
  41.     mov    cx,*STACKADDR        ;new sp
  42.     mov    ss,bx
  43.     mov    sp,cx
  44.     push    dx            ;save old stack on new stack
  45.     push    ax
  46. #ifdef BOOTROM
  47.         xor     si,si            ;zero for ROMs
  48. #else
  49.     mov    si,*0x100
  50. #endif
  51.     mov    ax,cs            ;now relocate ourself
  52.     mov    ds,ax            ;ds == cs in tiny (.com) model
  53.     xor    di,di            ;0 is base of relocated code
  54.     mov    es,bx            ;new cs and ds
  55.     mov    cx,*RAMSIZE
  56.     shr    cx,*1
  57.     rep
  58.     movsw
  59.     jnc    start1
  60.     movsb                ;last byte if RAMSIZE odd
  61. start1:    mov    ds,bx            ;new ds
  62.     jmpf    go-_start,RELOC>>4    ;switches cs and ip
  63. go:    call    _main            ;now executing in RAM
  64.     .globl    _exit
  65. _exit:
  66. ;    we reset sp to the location just before entering main
  67. ;    instead of relying on the return from main because exit
  68. ;    could have been called from anywhere
  69.     mov    cx,*(STACKADDR-4)
  70.     mov    sp,cx
  71.     pop    ax            ;restore old stack
  72.     pop    bx
  73.     mov    ss,bx
  74.     mov    sp,ax
  75. #ifdef BOOTROM
  76.     retf
  77. #else
  78.     int    *0x19
  79. #endif
  80.  
  81. /**************************************************************************
  82. CURRTICKS - Get Time
  83. **************************************************************************/
  84.     .globl    _currticks
  85. _currticks:
  86.     push    cx
  87.     xor    dx,dx
  88.     xor    ax,ax
  89.     int    *0x1a
  90.     mov    ax,dx
  91.     mov    dx,cx
  92.     pop    cx
  93.     ret
  94.  
  95. /**************************************************************************
  96. PUTCHAR - Print a character
  97. **************************************************************************/
  98.     .globl    _putchar
  99. _putchar:
  100.     push    bp
  101.     mov    bp,sp
  102.     push    cx
  103.     push    bx
  104.     movb    cl,4[bp]
  105.     mov    bx,*1
  106.     movb    ah,*0x0e
  107.     movb    al,cl
  108.     int    *0x10
  109.     pop    bx
  110.     pop    cx
  111.     pop    bp
  112.     ret
  113.  
  114. /**************************************************************************
  115. GETCHAR - Get a character
  116. **************************************************************************/
  117.     .globl    _getchar
  118. _getchar:
  119.     push    bx
  120.     movb    ah,*0x0
  121.     int    *0x16
  122.     movb    bl,al
  123.     xor    ax,ax
  124.     movb    al,bl
  125.     pop    bx
  126.     ret
  127.  
  128. /**************************************************************************
  129. ISKEY - Check for keyboard interrupt
  130. **************************************************************************/
  131.     .globl    _iskey
  132. _iskey:
  133.     push    bx
  134.     xor    bx,bx
  135.     movb    ah,*0x1
  136.     int    *0x16
  137.     jz    iskey1
  138.     movb    bl,al
  139. iskey1:
  140.     xor    ax,ax
  141.     movb    al,bl
  142.     pop    bx
  143.     ret
  144.  
  145. /**************************************************************************
  146. MEMSIZE - Determine size of extended memory
  147. **************************************************************************/
  148.  
  149.     .globl    _memsize
  150. _memsize:
  151.     push    bx
  152.     mov    ax,*0x8800
  153.     int    *0x15
  154.     mov    bx,ax
  155.     xor    ax,ax
  156.     mov    ax,bx
  157.     pop    bx
  158.     ret
  159.  
  160. /**************************************************************************
  161. START_PROG - Call program code
  162. **************************************************************************/
  163.     .globl    _start_linux
  164. _start_linux:
  165.     call    sl1
  166.     ret
  167. sl1:    jmpf    *0x0,*0x9020
  168.  
  169.     .globl    _xstart
  170. ;
  171. ;    usage: xstart(execaddr, headeraddr, bootpaddr);
  172. ;            4,6    8,10        12,14
  173. ;
  174. _xstart:
  175.     push    bp
  176.     mov    bp,sp
  177.     push    bx
  178.     push    cx
  179.     mov    ax,14[bp]
  180.     push    ax    /* bootp record */
  181.     mov    ax,12[bp]
  182.     push    ax
  183.     mov    ax,10[bp]
  184.     push    ax    /* file header */
  185.     mov    ax,8[bp]
  186.     push    ax
  187.     mov    ax,cs
  188.     push    ax    /* return address */
  189.     mov    ax,*xs1-_start
  190.     push    ax
  191.     mov    ax,6[bp]
  192.     push    ax    /* exec addr */
  193.     mov    ax,4[bp]
  194.     push    ax
  195.     retf        /* jump intersegment using a return */
  196. xs1:    pop    bp
  197.     pop    cx
  198.     pop    bx
  199.     ret
  200.  
  201. ; int inw(int port);
  202. ; reads a word from the i/o port  port  and returns it
  203.  
  204.     .globl    _inw
  205. _inw:
  206.     pop    bx
  207.     pop    dx
  208.     dec    sp
  209.     dec    sp
  210.     inw
  211.     jmp    bx
  212.  
  213. ; int inb(int port);
  214. ; reads a byte from the i/o port  port  and returns it
  215.  
  216.     .globl    _inb
  217. _inb:
  218.     pop    bx
  219.     pop    dx
  220.     dec    sp
  221.     dec    sp
  222.     inb
  223.     sub    ah,ah
  224.     jmp    bx
  225.  
  226. ; int insw(int port, char *dst, int nwords);
  227. ; block read from i/o port
  228.  
  229.     .globl    _insw
  230. _insw:
  231.     pop    bx        ;return address
  232.     pop    dx        ;port
  233.     pop    di        ;destination
  234.     pop    cx        ;count
  235. inswloop:
  236.     jcxz    inswret
  237.     inw
  238.     mov    [di],ax
  239.     inc    di
  240.     inc    di
  241.     dec    cx
  242.     jmp    inswloop
  243. inswret:
  244.     sub    sp,*6        ;precompensate for add in caller
  245.     jmp    bx
  246.  
  247. ; void outw(int port, int value);
  248. ; writes the word  value  to  the i/o port  port
  249.  
  250.     .globl    _outw
  251. _outw:
  252.     pop    bx
  253.     pop    dx
  254.     pop    ax
  255.     sub    sp,*4
  256.     outw
  257.     jmp    bx
  258.  
  259. ; void outb(int port, char value);
  260. ; writes the byte  value  to  the i/o port  port
  261.  
  262.     .globl    _outb
  263. _outb:
  264.     pop    bx
  265.     pop    dx
  266.     pop    ax
  267.     sub    sp,*4
  268.     outb
  269.     jmp    bx
  270.  
  271. ; int outsw(int port, char *src, int nwords);
  272. ; block write from i/o port
  273.  
  274.     .globl    _outsw
  275. _outsw:
  276.     pop    bx        ;return address
  277.     pop    dx        ;port
  278.     pop    di        ;destination
  279.     pop    cx        ;count
  280. outswloop:
  281.     jcxz    outswret
  282.     mov    ax,[di]
  283.     outw
  284.     inc    di
  285.     inc    di
  286.     dec    cx
  287.     jmp    outswloop
  288. outswret:
  289.     sub    sp,*6        ;precompensate for add in caller
  290.     jmp    bx
  291.  
  292. ;*************************************************************************
  293. ;    longswap
  294. ;    swap the bytes of a long integer from pc
  295. ;    order (reverse) to in-order.  this will work both ways.
  296. ;    returns the new long value
  297. ;    usage:
  298. ;    l2 = htonl/ntohl(l)
  299. ;
  300.     .globl    _htonl,_ntohl
  301. _htonl:
  302. _ntohl:
  303.     push    bp
  304.     mov    bp,sp
  305.     mov    ax,6[bp]    ;high bytes of the long int
  306.     mov    dx,4[bp]    ;low bytes of the long int
  307. ;
  308. ;    get the data
  309. ;
  310.     xchgb    al,ah        ;swap them, these are now low
  311.     xchgb    dl,dh        ;swap the others
  312.     pop    bp
  313.     ret
  314. ;
  315. ;*************************************************************************
  316. ;    intswap
  317. ;    swap the bytes of an integer, returns the swapped integer
  318. ;
  319. ;    usage: i = htons/ntohs(i);
  320. ;
  321.     .globl    _htons,_ntohs
  322. _htons:
  323. _ntohs:
  324.     push    bp
  325.     mov    bp,sp
  326.     mov    ax,4[bp]
  327.     xchgb    al,ah
  328.     pop    bp
  329.     ret
  330.  
  331. ;    lintoseg
  332. ;    extracts the segment from a linear address in bx,ax
  333. ;    returns segment in ax
  334. ;
  335. lintoseg:
  336.     and    ax,*0xfff0        ;clear bottom 4 bits
  337.     clc
  338.     rcr    bx,*1            ;and shift segment 4 bits down
  339.     rcr    ax,*1
  340.     rcr    bx,*1
  341.     rcr    ax,*1
  342.     rcr    bx,*1
  343.     rcr    ax,*1
  344.     rcr    bx,*1
  345.     rcr    ax,*1
  346.     ret
  347.  
  348. ;
  349. ;*************************************************************************
  350. ;    bcopyf
  351. ;    like bcopy, but copies intersegment
  352. ;
  353. ;    usage: bcopyf(p, fp, n);
  354. ;
  355.     .globl    _bcopyf
  356. _bcopyf:
  357.     push    bp
  358.     mov    bp,sp
  359.     push    di
  360.     push    si
  361.     push    es
  362.     cld
  363. ;    4[bp] = p, 6,8[bp] = fp, A[bp] = n
  364.     mov    si,4[bp]        ;p
  365.     mov    ax,6[bp]        ;fp low word
  366.     mov    di,ax
  367.     and    di,*0xf            ;keep LS 4 bits
  368.     mov    bx,8[bp]
  369.     call    lintoseg
  370.     mov    es,ax
  371.     mov    cx,$A[bp]
  372.     shr    cx,*1
  373.     rep
  374.     movsw
  375.     jnc    bcopyf1
  376.     movsb
  377. bcopyf1:
  378.     pop    es
  379.     pop    si
  380.     pop    di
  381.     pop    bp
  382.     ret
  383.  
  384. ;
  385. ;*************************************************************************
  386. ;    fbcopy
  387. ;    like bcopy, but copies intersegment
  388. ;
  389. ;    usage: fbcopy(fp, p, n);
  390. ;
  391.     .globl    _fbcopy
  392. _fbcopy:
  393.     push    bp
  394.     mov    bp,sp
  395.     push    di
  396.     push    si
  397.     push    es
  398.     cld
  399.     mov    ax,ds
  400.     mov    es,ax
  401. ;    4,6[bp] = fp, 8[bp] = p, A[bp] = n
  402.     mov    ax,4[bp]        ;fp low word
  403.     mov    si,ax
  404.     and    si,*0xf            ;keep LS 4 bits
  405.     mov    bx,6[bp]
  406.     call    lintoseg
  407.     mov    ds,ax
  408.     mov    di,8[bp]        ;p
  409.     mov    cx,$A[bp]
  410.     shr    cx,*1
  411.     rep
  412.     movsw
  413.     jnc    fcopyb1
  414.     movsb
  415. fcopyb1:
  416.     mov    ax,es
  417.     mov    ds,ax
  418.     pop    es
  419.     pop    si
  420.     pop    di
  421.     pop    bp
  422.     ret
  423.  
  424. ;
  425. ;*************************************************************************
  426. ;    fpeekw
  427. ;    returns one word from a far address
  428. ;
  429. ;    usage: fpeekw(fp);
  430. ;
  431.     .globl    _fpeekw
  432. _fpeekw:
  433.     push    bp
  434.     mov    bp,sp
  435.     push    si
  436. ;    4,6[bp] = fp, 8[bp] = p, A[bp] = n
  437.     mov    ax,4[bp]        ;fp low word
  438.     mov    si,ax
  439.     and    si,*0xf            ;keep LS 4 bits
  440.     mov    bx,6[bp]
  441.     call    lintoseg
  442.     mov    bx,ax
  443.     mov    ax,[bx+si]
  444.     pop    di
  445.     pop    bp
  446.     ret
  447.  
  448. ;
  449. ;*************************************************************************
  450. ;    bzerof
  451. ;    like bzero, but zeros any segment
  452. ;
  453. ;    usage: bzerof(fp, n);
  454. ;
  455.     .globl    _bzerof
  456. _bzerof:
  457.     push    bp
  458.     mov    bp,sp
  459.     push    di
  460.     push    si
  461.     push    es
  462.     cld
  463. ;    4,6[bp] = fp, 8[bp] = n
  464.     mov    ax,4[bp]        ;fp low word
  465.     mov    di,ax
  466.     and    di,*0xf            ;keep LS 4 bits
  467.     mov    bx,6[bp]
  468.     call    lintoseg
  469.     mov    es,ax
  470.     mov    cx,$8[bp]
  471.     xor    ax,ax
  472.     shr    cx,*1
  473.     rep
  474.     stosw
  475.     jnc    bzerof1
  476.     stosb
  477. bzerof1:
  478.     pop    es
  479.     pop    si
  480.     pop    di
  481.     pop    bp
  482.     ret
  483.  
  484. ;
  485. ;*************************************************************************
  486. ;    fbsame
  487. ;    returns 1 if all bytes from fp[0] to fp[n-1] have the value c
  488. ;
  489. ;    usage: fbsame(fp, c, n);
  490. ;
  491.     .globl    _fbsame
  492. _fbsame:
  493.     push    bp
  494.     mov    bp,sp
  495.     push    di
  496.     push    si
  497.     cld
  498. ;    4,6[bp] = fp, 8[bp] = c, A[bp] = n
  499.     mov    ax,4[bp]        ;fp low word
  500.     mov    di,ax
  501.     and    di,*0xf            ;keep LS 4 bits
  502.     mov    bx,6[bp]
  503.     call    lintoseg
  504.     mov    es,ax
  505.     mov    ax,8[bp]        ;c
  506.     mov    cx,$A[bp]
  507.     repe
  508.     scasb
  509.     mov    ax,*0            ;not xor because want to preserve z
  510.     jne    fbsameret
  511.     inc    ax
  512. fbsameret:
  513.     pop    si
  514.     pop    di
  515.     pop    bp
  516.     ret
  517.